作者:Adam Freeman 翻译:陈广 日期:2018-8-12
ASP.NET Core MVC是微软公司的一个web应用程序开发框架,它结合了model(模型)-view(视图)-controller(控制器)(MVC)体系结构的有效性和整洁性,敏捷开发的思想和技术,以及.NET平台的最佳部分。在本章中,您将了解 Microsoft 创建ASP.NET Core MVC的原因,了解它与其前身以及备选方案的比较,最后,概述ASP.NET Core MVC中的新内容以及本书所涵盖的内容。
最初的 ASP.NET 是在2002年引入的,当时微软热衷于保护传统桌面应用程序在开发中的主导地位,并将互联网视为一种威胁。图1-1显示了当时微软的技术栈。 图1-1 ASP.NET Web Forms技术栈
对于web Forms,微软试图通过将用户界面(UI)建模为服务器端控件对象的层次结构来隐藏超文本传输协议(HTTP)和超文本标记语言(HTML),这是当时许多开发人员所不熟悉的。每个控件都在请求中跟踪自己的状态,在需要时将自己渲染为HTML,并自动将客户端事件(如按钮单击)与相应的服务器端处理代码连接起来。实际上,web窗体是一个巨大的抽象层,旨在通过Web提供一个经典的事件驱动的图形用户界面(GUI)。
这样做的目的是让Web开发与开发桌面应用程序的感觉一样。开发人员可以从有状态UI的角度思考,而不需要使用一系列独立的 HTTP 请求和响应。微软可以无缝地将 Windows 桌面开发人员队伍转移到 Web 应用程序的新世界。
传统的 ASP.NET Web Forms 开发原则上是好的,但事实证明更为复杂。
Web窗体并不都是很糟糕,最终,微软致力于改进标准一致性和简化开发过程,甚至从最初的ASP.NET MVC框架中获得了一些特性,并将它们应用于 Web Forms。当您需要快速得出结果时,Web Forms会非常出色,您可以在一天内启动和运行一个相当复杂的 web 应用程序。但是,除非在开发过程中非常小心,否则您会发现您创建的应用程序很难测试和维护。
2007年10月,微软宣布了一个基于现有 ASP.NET 的新的开发平台,旨在直接回应对 Web Forms 的批评和 Ruby on Rails 等竞争平台的流行。新平台被命名为 ASP.NET MVC 框架,它反映了web应用程序开发的新趋势,如 HTML 和 CSS 标准化、RESTful web服务、有效的单元测试,以及开发人员应该接受 HTTP 的无状态特性的想法。
支持原始 MVC 框架的概念现在看来是自然而明显的,但在2007年 .NET Web 开发领域却缺乏这些概念。ASP.NET MVC 框架的引入使微软的Web开发平台回到了现代
MVC 框架也标志着微软的态度发生了重大变化,微软此前曾试图控制 Web 应用工具链中的每个组件。在 MVC 框架下,微软在 jQuery 等开源工具的基础上,采纳了竞争平台(以及更成功的平台)的设计约定和最佳实践,并将源代码发布到 MVC 框架中,供开发人员检查。
在创建 MVC 框架之初,微软在现有的ASP.NET平台之上创建它是有道理的,该平台具有许多坚实的低级别功能,为开发过程提供了先机,并且已经为ASP.NET开发人员所熟知和理解。
但是,要将 MVC 框架移植到最初为 Web Forms 设计的平台上,就需要妥协。MVC 框架开发人员习惯于使用配置设置和代码调整,从而禁用或重新配置与其 Web 应用程序无关的特性,但又需要让一切正常运转。
随着 MVC 框架的普及,微软开始采用一些核心功能并将它们添加到 Web Forms 中。结果越来越奇怪,支持 MVC 框架所需的设计古怪的特性被扩展到支持 Web Forms 中,为使所有东西都能结合在一起出现了更多的设计怪癖。与此同时,微软开始用 web service(Web API)和实时通信(SignalR)等新框架来扩展 ASP.NET。新框架添加了各自的配置和开发约定,每个配置和开发约定都有自己的优点和奇怪之处,总体结果是支离破碎的混乱。
2015年,微软宣布了 ASP.NET 和 MVC 框架的新方向,它最终产生了 ASP.NET Core MVC,就是本书的主题。
ASP.NET Core 是建立在 .NET Core 之上的,它是一个跨平台版本的 .NET 框架,没有 Windows 特定的应用程序编程接口(API)。Windows仍然是一个主流的操作系统,但是 web 应用程序越来越多地托管在云平台中的小型和简单容器中,通过采用跨平台的方法,微软扩展了 .NET 的范围,使将ASP.NET Core应用程序部署到更广泛的宿主环境中成为可能。并作为奖励,使开发人员能够在 Linux 和 macOS 上创建 ASP.NET Coer web 应用程序。
ASP.NET Core 是一种全新框架。它更简单,更易于使用,并且不受 Web Forms 遗留的影响。而且因为基于.NET Core,使得它支持在一系列平台和容器上开发 Web 应用程序。
ASP.NET Core MVC 提供了在新的 ASP.NET 核心平台上构建的原始 ASP.NET MVC 框架的功能,它集成了以前由 Web API 提供的功能,它包括一种更自然的生成复杂内容的方法,它使关键的开发任务(如单元测试)变得更为简单、更可预测。
ASP.NET Core MVC 2 版本侧重于通过对早期版本中引入的一些工具和平台的整合及更改进行工作。ASP.NET Core MVC 2 需要.NET Core 2,它拥有一个扩展庞大的 API 接口,在其他 Linux 发行版上得到了支持。有益的更改包括一个新的元包系统,它简化了 NuGet 包的管理,为ASP.NET Core提供了一个新的配置系统,并支持Entity Framework Core 2。最大的新特性 Razor Pages,它试图使用更现代的平台重新创建与网页相关的开发风格,但 MVC 开发人员对 Razor Pages 不感兴趣(我在本书中没有对它进行描述)。
下面几节简要描述了新的 MVC 平台如何克服了Web Forms和原始 MVC 框架的遗留问题,以及它是如何将ASP.NET带回前沿的。
ASP.NET Core MVC 遵循一种称为模型-视图-控制器的模式,它引导ASP.NET Web应用程序的形态及其包含的组件之间的交互。
区分 MVC 体系结构模式和 ASP.NET Core MVC 实现是很重要的。MVC 模式并不是新的-它可以追溯到1978年,Xerox PARC 上的 Smalltalk 项目,但它作为 Web 应用程序的一种模式在今天已经流行起来,原因如下:
ASP.NET Core MVC 实现了 MVC 模式,与 Web Forms 相比,它提供了更好的关注点分离。实际上,ASP.NET Core MVC实现了MVC模式的一个变体,特别适合于Web应用程序。您将在第 3 章中了解更多关于此体系结构的理论和实践。
ASP.NET Core 和 ASP.NET Core MVC 是作为一系列具有定义良好的特性、满足 .NET 接口或构建在抽象基类之上的独立组件构建的。您可以轻松地用自己实现的组件替换关键组件。一般来说,ASP.NET Core MVC为每个组件提供以下三种选项:
从第14章开始,您将了解所有各类相关组件,以及如何和为什么要调整或替换每个组件。
ASP.NET Core MVC生成干净、符合标准的标记。它的内置标签助手生成符合标准的输出,但与 Web Forms 相比,有一个更重要的哲学变化。ASP.NET Core MVC鼓励您使用 CSS 设计简单、优雅的标记,而不是生成一些您几乎无法控制的 HTML 片段。
当然,如果您确实想为复杂的UI元素(如日期选择器或级联菜单)添加一些现成的小部件,ASP.NET Core MVC 采用的“无特殊需求”方法可以方便地使用最好的客户端库,如jQuery、Angular、React或Bootstrap CSS库。ASP.NET Core MVC与这些库可以很好地结合在一起,微软使用了一些与它们相关的模板以快速启动新的开发项目。
ASP.NET Core MVC 与 HTTP 协同工作。您可以控制浏览器和服务器之间传递的请求,因此您可以根据自己的喜好微调用户体验。使用 Ajax 非常简单,创建 Web services 来接收浏览器 HTTP 请求是一个简单的过程,如第20章所述。
ASP.NET Core MVC 架构为您提供了一个很好的起点,使您的应用程序易于维护和可测试,因为您自然地将不同的应用程序关注点分成独立的部分。此外,ASP.NET Core平台和ASP.NET Core MVC框架的每一部分都可以被隔离并替换为单元测试,这样就可以使用任何流行的开源测试框架来执行,如我在第7章中介绍的xUnit。
在这本书中,您将看到如何为 ASP.NET MVC 的 Controller 和 Action 编写干净、简单的单元测试,以及使用各种测试和模拟策略为框架组件提供假的或模拟的实现来模拟任何场景的操作。即使您以前从未编写过单元测试,也会有一个很好的开始。
可测试性不仅仅是单元测试的问题。ASP.NET Core MVC应用程序也可以使用 UI 自动化测试工具很好地工作。您可以编写模拟用户交互的测试脚本,而无需猜测框架将生成哪些 HTML 元素结构、CSS类或ID,您也不必担心结构会意外地发生变化。
随着Web应用技术的改进,统一资源定位符(URL)的风格也发生了变化。像这样的URL:
/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742
越来越罕见,取而代之的是一种更简单、更干净的格式,如以下所示:
/to-rent/chicago/2303-silver-street
关注 URL 的结构有一些很好的理由。首先,搜索引擎重视在 URL 中找到的关键字。搜索 “rent in Chicago” 更有可能出现是那些 URL 更为简单的网址。其次,许多网络用户现在已经足够了解 URL,并通过在浏览器地址栏中键入它来欣赏导航的选择。第三,当某人理解 URL 的结构时,他们更有可能链接到它,与朋友共享它,甚至在电话上大声阅读它。第四,它不向公共互联网公开应用程序的技术细节、文件夹和文件名结构,因此您可以自由地更改底层实现而无需破坏传入的所有链接。
在早期的框架中很难实现干净的 URL,但是 ASP.NET Core MVC 使用一个称为 URL 路由的特性,通过默认方式提供干净的 URL。这使您可以控制 URL schema 及其与应用程序的关系,使您可以自由地创建对用户有意义和有用的 URL 模式,而不需要遵循预先定义的模式。这意味着如果愿意的话,您可以很容易地定义一个现代的 REST 风格的 URL schema。您将在第15章和第16章中找到关于 URL 路由的详细描述。
微软的 .NET 平台随着每一个主要版本的演变,它支持甚至定义了现代编程中最先进技术。ASP.NET Core MVC是为 .NET Core 构建的,因此它的 API 可以充分利用 C# 程序员所熟悉的语言和运行时的新概念,包括 await 关键字,扩展方法,lambda 表达式,匿名和动态类型,以及Language Integrated Query (语言集成查询:LINQ)。
许多 ASP.NET Core MVC API 方法和编码模式比早期平台更为简洁、更有表现力。无需担心你没有跟上最新的 C# 语言特性,我在第4章提供了对于 MVC 开发来说最重要的 C# 特性的概要。
之前的 ASP.NET 版本只适用于 Windows,需要使用 Windows 桌面来编写 web 应用程序,并要求 Windows 服务器部署和运行它们。微软让 ASP.NET Core 可以跨平台进行开发和部署。.NET Core 可用于不同平台,包括 macOS 和一系列流行的Linux发行版。跨平台支持使得部署 ASP.NET Core MVC 应用程序变得更为简单,并且对使用应用程序容器平台(如 Docker)提供了良好的支持。
大多数 ASP.NET Core MVC 的开发很可能在不久的将来都会使用 Visual Studio 来进行,但微软还创建了一个跨平台开发工具:Visual Studio Code,这意味着ASP.NET Coer MVC开发不再局限于Windows。
与之前的微软 web 开发平台不同,您可以免费下载 ASP.NET Core 和 ASP.NET Core MVC 的源代码,甚至可以修改和编译自己的版本。当您的调试跟踪引导到一个系统组件并希望深入到它的代码中(甚至阅读原始程序员的注释)时,这是无价的。如果您正在构建高级组件,并且希望了解存在哪些开发可能性或内置组件是如何工作的,则它也非常有用。
您可以从 https://github.com/aspnet下载 ASP.NET Core 和 ASP.NET Core MVC 源代码。
要想从这本书中得到最大的收获,您应该熟悉 web 开发的基本知识,了解 HTML 和 CSS 是如何工作的,并对 C# 有一定的了解。如果您对客户端的细节如 JavaScript 有些模糊,请不必担心。本书重点是服务器端开发,您可以通过里面的示例获取所需的内容。在第4章,我概述了 MVC 开发中最有用的 C# 语言特性,如果您要从早期版本转移到最新的 .NET 版本,会发现它非常有用。
本书分为两部分,每一部分都涉及一组相关的主题。
这本书从 ASP.NET Core MVC 来龙去脉开始。我解释了 MVC 模式的好处和实际影响,介绍了 ASP.NET Core MVC 如何适应现代 Web 开发,并描述了每个 ASP.NET Core MVC 开发者所需的工具和 C# 语言特性。
在第二章,您将直接创建一个简单的 web 应用程序,并了解主要组件和构建块是什么,以及它们是如何组合在一起的。然而,这本书大部分时都介绍了一个名为 “SportStore” 的项目开发,通过这个项目,我将向您展示从开始一直到部署的现实开发过程,涉及了 ASP.NET Core MVC 的主要特性。
在第2部分中,我解释了在构建 SportsStore 应用程序时需要使用到的 ASP.NET Core MVC 某些特性的内部工作原理。我向您展示了每个特性是如何工作的,解释了它所起的作用,并向您展示了可用的配置和自定义选项。在第1部分中设定了大背景之后,我们将深入研究第2部分中的详细内容。
您可以从https://github.com/apress/pro-asp.net-core-mvc-2下载本书所有章节的示例代码。下载是免费的,并包括重新创建示例所需的所有支持资源,从而不必键入它们。您不必下载代码,但这是使用示例进行实验的最简单方法,并且可以轻松地将代码复制和粘贴到自己的项目中。
您可以在本书的 GitHub 仓库中的 Errata 文件中找到这本书的勘误表。 (https://github.com/apress/pro-asp.net-core-mvc-2)
如果您使用各章示例时出现问题,或在书中发现了问题,那么你可以通过 adam@adam-freeman.com 给我发电子邮件,我会尽力帮忙。请在 https://github.com/apress/pro-asp.net-core-mvc-2 查看这本书的勘误表,在联系我之前看看它是否包含了解决您的问题的方法。
在本章中,我解释了ASP.NET Core MVC存在的背景,以及它是如何从 Web Forms 和最初的ASP.NET MVC 框架中演化而来的。我描述了使用 ASP.NET Core MVC 的优势和本书的架构。在下一章中,您将看到 ASP.NET Core MVC 的运行,并简单地演示了提供这些优势的特性。
;